# MapBasedColumnedRow.java

    package org.codefilarete.stalactite.sql.result;

    import java.util.HashMap;
    import java.util.Map;

    import org.codefilarete.stalactite.query.api.Selectable;
    import org.codefilarete.stalactite.query.api.Selectable.SimpleSelectable;

    /**
     * Default implementation of a {@link ColumnedRow} that stores {@link java.sql.ResultSet} data in memory through a {@link Map}.
     * This class is not expected to be exposed to end users, the {@link ColumnedRow} interface must be exposed instead.
     *
     * @author Guillaume Mary
     */
    public class MapBasedColumnedRow extends AbstractRow<Selectable<?>> implements ColumnedRow {

    	public MapBasedColumnedRow() {
    		this(new HashMap<>());
    	}

    	protected MapBasedColumnedRow(Map<Selectable<?>, Object> content) {
    		super(content);
    	}

    	/**
    	 * Equivalent to {@link super#put(Object, Object)} with better typing
    	 *
    	 * @param key    the column to set a value for
    	 * @param object the column value
    	 * @param <E>    the column data type
    	 */
    	public <E> void put(Selectable<E> key, E object) {
    		super.put(key, object);
    	}

    	/**
    	 * Equivalent to {@link super#add(Object, Object)} with better typing
    	 *
    	 * @param key    the column to set a value for
    	 * @param object the column value
    	 * @param <E>    the column data type
    	 */
    	public <E> MapBasedColumnedRow add(Selectable<E> key, E object) {
    		put(key, object);
    		return this;
    	}

    	/**
    	 * Facility method that adds given key as a {@link SimpleSelectable}
    	 * @param key the alias of the column to add a value for
    	 * @param object the column value
    	 * @return this
    	 * @param <E> data type
    	 */
    	public <E> MapBasedColumnedRow add(String key, E object) {
    		return add(new SimpleSelectable<E>(key, (Class<E>) (object == null ? Object.class : object.getClass())), object);
    	}

    	/**
    	 * Equivalent to {@link super#get(Object)} with better typing
    	 * @param key the column to get a value from
    	 * @return the column data
    	 * @param <E> the column data type
    	 */
    	public <E> E get(Selectable<E> key) {
    		return (E) super.get(key);
    	}
    }